import { useEffect, useRef } from 'react';

interface UseIntervalProps {
  callback: () => void;
  delay: number | null;
  immediate?: boolean;
}

/**
 * 定时器 Hook
 * @param callback 回调函数
 * @param delay 延迟时间（毫秒），如果为 null 则停止定时器
 * @param immediate 是否立即执行一次回调函数，默认为 false
 */
const useInterval = ({ callback, delay, immediate = false }: UseIntervalProps) => {
  const savedCallback = useRef<() => void>();

  // 保存新回调
  useEffect(() => {
    savedCallback.current = callback;
  }, [callback]);

  // 设置定时器
  useEffect(() => {
    // 如果 delay 为 null 则不启动定时器
    if (delay === null) return;

    // 如果需要立即执行一次
    if (immediate) {
      savedCallback.current?.();
    }

    const timer = setInterval(() => {
      savedCallback.current?.();
    }, delay);

    // 清除定时器
    return () => clearInterval(timer);
  }, [delay, immediate]);
};

export default useInterval;